package cn.tedu.baidashi.service.Impl;

import cn.tedu.baidashi.exception.ServiceException;
import cn.tedu.baidashi.mapper.CartMapper;
import cn.tedu.baidashi.mapper.ItemsImgMapper;
import cn.tedu.baidashi.mapper.ItemsMapper;
import cn.tedu.baidashi.model.Cart;
import cn.tedu.baidashi.model.Items;
import cn.tedu.baidashi.model.ItemsImg;
import cn.tedu.baidashi.service.ICartService;
import cn.tedu.baidashi.utils.BigDecimalUtil;
import cn.tedu.baidashi.vo.CartItemsVO;
import cn.tedu.baidashi.vo.CartVO;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

@Service
public class CartServiceImpl implements ICartService {

    @Resource
    private ItemsMapper itemsMapper;
    @Resource
    private CartMapper cartMapper;
    @Resource
    private ItemsImgMapper itemsImgMapper;

    /**
     * 获得购物车
     * @param userId 用户id
     * @return 返回购物车CartVO
     */
    public CartVO getCart(Integer userId){
        //创建购物车商品集合
        List<CartItemsVO> cartItemsVOLists=new ArrayList<>();
        //根据userId查询出购物车商品
        List<Cart> cartList=cartMapper.findCartsByUserId(userId);

        BigDecimal cartItemsTotal=new BigDecimal("0");
        if (cartList != null){
            //开始根据购物车拼装购物车商品信息
            for (Cart cart : cartList) {
                CartItemsVO cartItemsVO=new CartItemsVO();
                //根据itemsId查询出商品信息
                Items items=itemsMapper.findItemsById(cart.getItemsId());

                if (items != null){
                    //根据商品id查询出商品图片
                    ItemsImg itemsImg=itemsImgMapper.findItemsImgByItemsId(cart.getItemsId());
                    //存入购物车商品集合
                    cartItemsVO.setItemsId(items.getId())
                            .setImage(itemsImg.getUrl())
                            .setItemsName(items.getItemsName())
                            .setUtilPrice(BigDecimalUtil.formatToNumber(items.getPrice()));
                    //判断商品库存
                    Integer buyQuantity=0;
                    //商品库存大于购物车数量
                    if (cart.getQuantity()<=items.getStock()){
                        buyQuantity=cart.getQuantity();

                    }else{
                        //商品库存小于购物车数量
                        buyQuantity=items.getStock();
                    }
                    cartItemsVO.setItemsCount(buyQuantity);
                    //计算商品总价
                    BigDecimal total= BigDecimalUtil.multiply(items.getPrice().doubleValue(),buyQuantity.doubleValue());
                    cartItemsVO.setTotal(BigDecimalUtil.formatToNumber(total));
                    //计算购物车总价
                    cartItemsTotal=BigDecimalUtil.add(cartItemsTotal.doubleValue(),total.doubleValue());

                }
                cartItemsVOLists.add(cartItemsVO);
            }
        }
        //计算购物车商品总价

        //拼装购物车
        CartVO cartVO=new CartVO();
        cartVO.setCartItemsVOList(cartItemsVOLists)
                .setCartTotal(BigDecimalUtil.formatToNumber(cartItemsTotal))
                .setOrderTotal(BigDecimalUtil.formatToNumber(cartItemsTotal));

        return cartVO;
    }

    /**
     * 修改购物车商品数量
     * @param quantity 数量
     * @param userId 用户id
     * @param itemsId 商品id
     */
    @Override
    public void updateCount(Integer userId,Integer itemsId,Integer quantity) {
        //判断新数量是否大于库存
        Items items=itemsMapper.findItemsById(userId);
        int num=0;
        if (quantity<=items.getStock()){
            num=cartMapper.updateCountById(userId,itemsId,quantity);
        }else {
            num=cartMapper.updateCountById(userId,itemsId,items.getStock());
            throw new ServiceException("超过最大库存");
        }
        if (num!=1){
            throw new ServiceException("修改失败，数据库异常");
        }
    }

    /**
     * 添加商品进入购物车
     * @param quantity 商品数量
     * @param userId 用户id
     * @param itemsId 商品id
     */
    @Override
    public void addCart(Integer userId,Integer itemsId,Integer quantity) {

        Cart cart=cartMapper.findCartById(userId, itemsId);
        int num=0;
        //购物车中没有该商品
        if (cart==null){
            //判断商品库存
            Items items=itemsMapper.findItemsById(itemsId);
            //新增商品
            if (quantity<=items.getStock()){
                num=cartMapper.addCartByIdAndQuantity(userId,itemsId,quantity);
            }else {
                num=cartMapper.addCartByIdAndQuantity(userId,itemsId,items.getStock());
                throw new ServiceException("超过最大库存");
            }
            if (num != 1) {
                throw new ServiceException("新增失败，数据库异常");
            }
        }else {
            updateCount(userId,itemsId,quantity+cart.getQuantity());
        }
    }

    /**
     * 删除商品
     * @param userId 用户id
     * @param itemsId 商品id
     */
    @Override
    public void deleteCart(Integer userId,Integer itemsId) {
        int num=cartMapper.deleteItemsById(userId,itemsId);
        if (num!=1){
            throw new ServiceException("删除失败，数据库异常");
        }
    }
}
